package top.mccsdl.Acbot.utils;

import java.security.SecureRandom;

public class DesensitizationUtil {

    private static final String SYMBOL = "*";

    /**
     * 通用脱敏方法，显示前3位与后3位
     * @param value 输入字符串
     * @return 脱敏后的字符串
     */
    public static String commonDisplay(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }

        int len = value.length();
        if (len <= 8) {
            // 如果长度小于等于8，则不脱敏或仅部分脱敏
            if (len <= 4) {
                // 如果长度小于等于4，则直接返回原字符串
                return value;
            } else {
                // 如果长度大于4且小于等于8，则显示前4位和后(len-4)位
                StringBuilder sb = new StringBuilder(value.substring(0, 4));
                sb.append(value.substring(len - 4));
                return sb.toString();
            }
        }

        // 构建脱敏后的字符串
        StringBuilder stringBuilder = new StringBuilder(len);
        stringBuilder.append(value, 0, 3); // 显示前3位字符

        // 添加脱敏符号，数量等于原字符串长度减去前4位和后4位的数量
        for (int i = 0; i < len - 8; i++) {
            stringBuilder.append(SYMBOL);
        }

        stringBuilder.append(value.substring(len - 3)); // 显示后3位字符

        return stringBuilder.toString();
    }

    /**
     * 频道接收到的msg处理
     * @param input content
     * @return content 空格分割的数组
     */
    public static String[] channelMsgAndSplit(String input) {
        // 找到第一个 '<' 和第一个 '>' 的索引
        int startIndex = input.indexOf('<');
        int endIndex = input.indexOf('>', startIndex);
        // 检查是否找到了有效的 '<' 和 '>'
        if (startIndex == -1 || endIndex == -1 || startIndex >= endIndex) {
            return input.split("\\s+");
        }
        // 截取并移除 '<' 到 '>' 之间的部分（包括 '<' 和 '>'）
        String remainingString = input.substring(endIndex + 1).trim();
        return remainingString.split("\\s+");
    }

    /**
     * 判断字符串是否是QQ号
     *
     * @param qqStr 需要判断的字符串
     * @return 如果是QQ号则返回true，否则返回false
     */
    public static boolean isQQNumber(String qqStr) {
        // QQ号必须全为数字
        if (!qqStr.matches("\\d+")) {
            return false;
        }
        // QQ号长度必须在5到14位之间
        int length = qqStr.length();
        if (length < 5 || length > 14) {
            return false;
        }
        return true;
    }
    public static String generate32BitKey() {
        SecureRandom secureRandom = new SecureRandom();
        byte[] keyBytes = new byte[16];
        secureRandom.nextBytes(keyBytes);
        StringBuilder keyBuilder = new StringBuilder();
        for (byte b : keyBytes) {
            keyBuilder.append(String.format("%02X", b));
        }
        return addHyphens(keyBuilder.toString());
    }

    private static String addHyphens(String key) {
        StringBuilder formattedKey = new StringBuilder();
        for (int i = 0; i < key.length(); i++) {
            formattedKey.append(key.charAt(i));
            if ((i + 1) % 4 == 0 && i != key.length() - 1) {
                formattedKey.append("-");
            }
        }
        return formattedKey.toString();
    }
    public static String generate16BitKey() {
        SecureRandom secureRandom = new SecureRandom();
        byte[] keyBytes = new byte[8];
        secureRandom.nextBytes(keyBytes);
        StringBuilder keyBuilder = new StringBuilder();
        for (byte b : keyBytes) {
            keyBuilder.append(String.format("%02X", b));
        }
        return addHyphens(keyBuilder.toString());
    }


    public static void main(String[] args) {
        String key = generate16BitKey();
        System.out.println("生成的 16 位密钥: " + key);
    }
}
